#!/bin/bash

#***********************************************************************
#
#				BuscarV5
#
#***********************************************************************
RG_IFS=","
RD_IFS="+-#-+"
#***********************************************************************
#GrabarGlobal: Graba el resultado de una corrida de buscarV5 en el 
#archivo global correspondiente al patron usado
#***********************************************************************
#Parametros:
#$1:Expresion regular, $2:Contexto L o C, $3:desde que linea,
#$4:hasta que linea, $5:cantidad de hallazgos, $6:archivo, $7:PAT_ID
#***********************************************************************
function grabarGlobal {
		
	contenido=`echo "$SECUENCIA2$RG_IFS$6$RG_IFS$1$RG_IFS$2$RG_IFS$3$RG_IFS$4$RG_IFS$5"`
	archSalida=`echo "rglobales.$7"`
	existe=`ls "$PROCDIR" | grep "$archSalida"`
	if [ $? -eq 0 ]; then  #Archivo existe
		contAnterior=`cat "$PROCDIR/$archSalida"`
		echo "${contAnterior}
$contenido" > "$PROCDIR/$archSalida"
	else
		echo "$contenido" > "$PROCDIR/$archSalida"
		chmod +rw "$PROCDIR/$archSalida"
	fi
	
}

#***********************************************************************
#GrabarDetallado: Graba el resultado de una busqueda de un patron en un
#determinado archivo en el archivo datallado correspondiente al patron
#usado
#***********************************************************************
#Parametros:
#$1:Numero de linea a grabar, $2:Contexto L o C, $3:desde que linea,
#$4:hasta que linea, $5:cantidad de hallazgos, $6:archivo, $7:PAT_ID
#***********************************************************************
function grabarDetallado {
	if [ $2 = 'L' -o $2 = "linea" ]; then
		let linicial=$1+$3-1
		let lfinal=$1+$4-1
		resultado=`cat "$ACEPDIR/$6" | sed -n "$linicial,$lfinal"p`	
	else
		resultado=`cat "$ACEPDIR/$6" | sed -n "$1,$1"p`
		let Cini=$3-1
		let Cfin=$4-$Cini
		resultado=`echo ${resultado:$Cini:$Cfin}`				 
	fi

	archSalida=`echo "resultados.$7"`

	IFS=$'\n'
	for item in $resultado
	do
		contenido=`echo "$SECUENCIA2$RD_IFS$6$RD_IFS$1$RD_IFS$item"`
		echo "$contenido" >> "$PROCDIR/$archSalida"
	done
	
	
}

#***********************************************************************
#AplicarPatron: Aplica un patron a un archivo y envia a guardar el 
#resultado en los archivos datallado y global
#***********************************************************************
#Parametros:
#$1:Patron (ER y parametros), $2:nombre archivo
#***********************************************************************
function aplicarPatron {
	let hallazgos=0
	PAT_ID=`echo "$1" | sed 's/,[^,]*,[^,]*,[^,]*,[^,]*$//'`
	PAT_EXP=`echo "$1" | sed "s/^[^,]*,//" | sed "s/,[^,]*,[^,]*,[^,]*$//"`
	PAT_CON=`echo "$1" | sed 's/^[^,]*,[^,]*,//' | sed 's/,[^,]*,[^,]*$//'`
	DESDE=`echo "$1" | sed 's/^[^,]*,[^,]*,[^,]*,//' | sed 's/,[^,]*$//'`
	HASTA=`echo "$1" | sed 's/^[^,]*,[^,]*,[^,]*,[^,]*,//' | sed "s/.$//"`
	patron=`echo "$patron" | sed "s/^\'//" | sed "s/\'$//"`
	
	PAT_EXP=`echo "$PAT_EXP" | sed "s/^'//" | sed "s/'$//"`	
	
	#Recorro el archivo en busca de coincidencias
	let numLinea=1
	IFS=$'\n'
	for linea in $(cat "$ACEPDIR/$2")
	do
		procesado=`echo "$linea" | grep "$PAT_EXP"`
		if [ $? -eq 0 ];
		then			
			hallazgos=`expr $hallazgos + 1`
			grabarDetallado "$numLinea" "$PAT_CON" "$DESDE" "$HASTA" "$hallazgos" "$archivo" 				"$PAT_ID"			
		fi
		numLinea=`expr $numLinea + 1`	
	done 		
	unset IFS
			
	#Terminamos de procesar el patron, grabo el archivo global
	grabarGlobal "$PAT_EXP" "$PAT_CON" "$DESDE" "$HASTA" "$hallazgos" "$archivo" "$PAT_ID"

	return $hallazgos
}

#***********************************************************************
#ComprobarDemonio: Verifica que no haya otra instancia de buscarV5 
#corriendo. De ya haber otra corriendo, termina el programa actual.
#***********************************************************************
function comprobarDemonio {
		
	if ps -A | grep -v $$ | grep "BuscarV5.sh"  > /dev/null
	then
		echo "Ya hay otra instancia de BuscarV5 corriendo."
		exit 0 
	fi	
}

#***********************************************************************
#BuscarV5: Punto de entrada del programa. Verifica que los archivos
#en la carpeta de aceptados no hayan sido procesados anteriormente,
#mueve a rechazados los que ya fueron procesados, a los demas encuentra
#los patrones a aplicar y manda a aplicar los mismos. Finalmente los mueve
#a procesados.  
#***********************************************************************
function buscarV5 {

comprobarDemonio

#Aumento el numero de ciclo
let SECUENCIA2=$SECUENCIA2+1

#Consigo la cantidad de archivos en la carpeta de aceptados
cantArch=`ls "$ACEPDIR" | grep -c '^'`

#Grabo en log
LoguearV5.sh -c "BuscarV5" -m "Inicio BuscarV5 – Ciclo Nro.: $SECUENCIA2 - Cantidad de Archivos: $cantArch" -t I &
wait $!

let sinPatrones=0 
let archConHallazgos=0
let i=0
while [ $i -lt $cantArch ];
do	
	#Consigo un archivo de la carpeta de aceptados
	archivo=`ls "$ACEPDIR" | head -n 1`
	
	#Grabo en log
	LoguearV5.sh -c "BuscarV5" -m "Archivo a procesar: $ACEPDIR/$archivo" -t I &
	wait $!

	#Verifico si ya fue procesado
	ls "$PROCDIR" | grep "$archivo"
	if [ $? -eq 0 ]; then
		#Muevo a rechazados
		LoguearV5.sh -c "BuscarV5" -m "10" -t E &
		LoguearV5.sh -c "BuscarV5" -m "$ACEPDIR/$archivo" -t E &
		MoverV5.sh -o "$ACEPDIR/$archivo" -d "$RECHDIR" -c "BuscarV5" &
		wait $!
	else
		#Proceso
		#Busco las expresiones regulares correspondientes al codigo de sistema
		codSis=`echo "$archivo" | sed 's/_.*$//'` 
		patrones=`cat "$MAEDIR/patrones" | grep "^[^,]*,[^,]*,$codSis,[^,]*,[^,]*,[^,]*$"`
		patrones=`echo "$patrones" | sed 's-\(^[^,]*,[^,]*,\)\([^,]*,\)\([^,]*,[^,]*,[^,]*$\)-\1\3-'`	
		
		#Consigo la cantidad de patrones encontrados
		cantPatrones=`echo "$patrones" | grep -c '^'`
		if [ $cantPatrones = 0 ]; then
			let sinPatrones=$sinPatrones+1
			LoguearV5.sh -c "BuscarV5" -m "No hay patrones aplicables para este archivo" -t A &
			wait $!	
		fi
		
		let coincidencia=0
		IFS=$'\n'
		for patron in $patrones
		do
			aplicarPatron "$patron" "$archivo"
			if [ $? -gt 0 ]; then
				let coincidencia=1
			fi
		done	
		unset IFS
		
		if [ $coincidencia -eq 1 ]; then
			let archConHallazgos=$archConHallazgos+1			
		fi

		#Muevo el archivo a procesados
		MoverV5.sh -o "$ACEPDIR/$archivo" -d "$PROCDIR" -c "BuscarV5" &
		wait $!					
	fi

	let i=$i+1
done

#Log final
let diferencia=$cantArch-$archConHallazgos
LoguearV5.sh -c "BuscarV5" -m "Fin del Ciclo: $SECUENCIA2 - Cantidad de Archivos con Hallazgos: $archConHallazgos – Cantidad
de Archivos sin Hallazgos: $diferencia – Cantidad de Archivos sin Patrón
aplicable: $sinPatrones" -t I &
wait $!

}


#***********************************************************************
#        			Ejecuto BuscarV5
#***********************************************************************
buscarV5


